package com.charon.auth.handler;

import com.charon.auth.enumeration.LoginType;
import com.charon.auth.properties.SecurityProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
  *@ClassName: AuthSuccessHandler
  *@Description: 自定义认证成功处理器
 *                  可以实现AuthenticationSuccessHandler接口来实现该类
 *                  也可以继承Security中已经实现该接口的类，
 *                  当前使用的是SavedRequestAwareAuthenticationSuccessHandler。
  *@Author: Charon [248135724@qq.com]
  *@Date: 2019/1/18 0018 22:35
  *@Version: 1.0
  */
@Slf4j
@Component
public class AuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

    /**
     * ObjectMapper是Jackson中的，SpringMvc在启动的时候会自动注册一个ObjectMapper，
     * 他的主要作用是Java对象和JSON结构之间的转换（映射）。
     */
    @Autowired
    private ObjectMapper objectMapper;

    @Autowired
    private SecurityProperties securityProperties;

    //认证成功时的回调
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {
        //authentication：该参数中包含了用户权限，认证请求，认证IP，认证SessionId等等，如果使用了第三方登录，如qq，微信等信息，
        //那么该对象中还包含了openId等信息。

        //登录之后，一般还需要进行其他处理，例如：保存登录时间、登录ip到数据库，
        // 缓存用户信息到redis数据库，根据不同权限跳转不同首页等等，这些操作可以在此处写。
        log.warn("登陆成功回调类：AuthSuccessHandler：" + authentication.getName());
        if (LoginType.JSON.equals(securityProperties.getBrowser().getLoginType())) {
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write(objectMapper.writeValueAsString(authentication));
        }else{
            //父类的默认实现是跳转登录之前的页面
            super.onAuthenticationSuccess(request,response,authentication);
        }
    }
}
